home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / LINUX / SOCKET.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  9KB  |  277 lines

  1. #ifndef _LINUX_SOCKET_H
  2. #define _LINUX_SOCKET_H
  3.  
  4. #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
  5.  
  6. #include <asm/socket.h>            /* arch-dependent defines    */
  7. #include <linux/sockios.h>        /* the SIOCxxx I/O controls    */
  8. #include <linux/uio.h>            /* iovec support        */
  9. #include <linux/types.h>        /* pid_t            */
  10.  
  11. typedef unsigned short    sa_family_t;
  12.  
  13. /*
  14.  *    1003.1g requires sa_family_t and that sa_data is char.
  15.  */
  16.  
  17. struct sockaddr {
  18.     sa_family_t    sa_family;    /* address family, AF_xxx    */
  19.     char        sa_data[14];    /* 14 bytes of protocol address    */
  20. };
  21.  
  22. struct linger {
  23.     int        l_onoff;    /* Linger active        */
  24.     int        l_linger;    /* How long to linger for    */
  25. };
  26.  
  27. /*
  28.  *    As we do 4.4BSD message passing we use a 4.4BSD message passing
  29.  *    system, not 4.3. Thus msg_accrights(len) are now missing. They
  30.  *    belong in an obscure libc emulation or the bin.
  31.  */
  32.  
  33. struct msghdr {
  34.     void    *    msg_name;    /* Socket name            */
  35.     int        msg_namelen;    /* Length of name        */
  36.     struct iovec *    msg_iov;    /* Data blocks            */
  37.     __kernel_size_t    msg_iovlen;    /* Number of blocks        */
  38.     void     *    msg_control;    /* Per protocol magic (eg BSD file descriptor passing) */
  39.     __kernel_size_t    msg_controllen;    /* Length of cmsg list */
  40.     unsigned    msg_flags;
  41. };
  42.  
  43. /*
  44.  *    POSIX 1003.1g - ancillary data object information
  45.  *    Ancillary data consits of a sequence of pairs of
  46.  *    (cmsghdr, cmsg_data[])
  47.  */
  48.  
  49. struct cmsghdr {
  50.     __kernel_size_t    cmsg_len;    /* data byte count, including hdr */
  51.         int        cmsg_level;    /* originating protocol */
  52.         int        cmsg_type;    /* protocol-specific type */
  53. };
  54.  
  55. /*
  56.  *    Ancilliary data object information MACROS
  57.  *    Table 5-14 of POSIX 1003.1g
  58.  */
  59.  
  60. #define __CMSG_NXTHDR(ctl, len, cmsg) __cmsg_nxthdr((ctl),(len),(cmsg))
  61. #define CMSG_NXTHDR(mhdr, cmsg) cmsg_nxthdr((mhdr), (cmsg))
  62.  
  63. #define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
  64.  
  65. #define CMSG_DATA(cmsg)    ((void *)((char *)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
  66. #define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
  67. #define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
  68.  
  69. #define __CMSG_FIRSTHDR(ctl,len) ((len) >= sizeof(struct cmsghdr) ? \
  70.                   (struct cmsghdr *)(ctl) : \
  71.                   (struct cmsghdr *)NULL)
  72. #define CMSG_FIRSTHDR(msg)    __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
  73.  
  74. /*
  75.  *    This mess will go away with glibc
  76.  */
  77.  
  78. #ifdef __KERNEL__
  79. #define __KINLINE extern __inline__
  80. #elif  defined(__GNUC__) 
  81. #define __KINLINE static __inline__
  82. #elif defined(__cplusplus)
  83. #define __KINLINE static inline
  84. #else
  85. #define __KINLINE static
  86. #endif
  87.  
  88.  
  89. /*
  90.  *    Get the next cmsg header
  91.  *
  92.  *    PLEASE, do not touch this function. If you think, that it is
  93.  *    incorrect, grep kernel sources and think about consequences
  94.  *    before trying to improve it.
  95.  *
  96.  *    Now it always returns valid, not truncated ancillary object
  97.  *    HEADER. But caller still MUST check, that cmsg->cmsg_len is
  98.  *    inside range, given by msg->msg_controllen before using
  99.  *    ansillary object DATA.                --ANK (980731)
  100.  */
  101.  
  102. __KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
  103.                            struct cmsghdr *__cmsg)
  104. {
  105.     struct cmsghdr * __ptr;
  106.  
  107.     __ptr = (struct cmsghdr*)(((unsigned char *) __cmsg) +  CMSG_ALIGN(__cmsg->cmsg_len));
  108.     if ((unsigned long)((char*)(__ptr+1) - (char *) __ctl) > __size)
  109.         return NULL;
  110.  
  111.     return __ptr;
  112. }
  113.  
  114. __KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
  115. {
  116.     return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
  117. }
  118.  
  119. /* "Socket"-level control message types: */
  120.  
  121. #define    SCM_RIGHTS    0x01        /* rw: access rights (array of int) */
  122. #define SCM_CREDENTIALS 0x02        /* rw: struct ucred        */
  123. #define SCM_CONNECT    0x03        /* rw: struct scm_connect    */
  124.  
  125. struct ucred {
  126.     __u32    pid;
  127.     __u32    uid;
  128.     __u32    gid;
  129. };
  130.  
  131. /* Socket types. */
  132.  
  133. #define SOCK_STREAM    1        /* stream (connection) socket    */
  134. #define SOCK_DGRAM    2        /* datagram (conn.less) socket    */
  135. #define SOCK_RAW    3        /* raw socket            */
  136. #define SOCK_RDM    4        /* reliably-delivered message    */
  137. #define SOCK_SEQPACKET    5        /* sequential packet socket    */
  138. #define SOCK_PACKET    10        /* linux specific way of    */
  139.                     /* getting packets at the dev    */
  140.                     /* level.  For writing rarp and    */
  141.                     /* other similar things on the    */
  142.                     /* user level.            */
  143.  
  144. /* Supported address families. */
  145. #define AF_UNSPEC    0
  146. #define AF_UNIX        1    /* Unix domain sockets         */
  147. #define AF_LOCAL    1    /* POSIX name for AF_UNIX    */
  148. #define AF_INET        2    /* Internet IP Protocol     */
  149. #define AF_AX25        3    /* Amateur Radio AX.25         */
  150. #define AF_IPX        4    /* Novell IPX             */
  151. #define AF_APPLETALK    5    /* AppleTalk DDP         */
  152. #define AF_NETROM    6    /* Amateur Radio NET/ROM     */
  153. #define AF_BRIDGE    7    /* Multiprotocol bridge     */
  154. #define AF_ATMPVC    8    /* ATM PVCs            */
  155. #define AF_X25        9    /* Reserved for X.25 project     */
  156. #define AF_INET6    10    /* IP version 6            */
  157. #define AF_ROSE        11    /* Amateur Radio X.25 PLP    */
  158. #define AF_DECnet    12    /* Reserved for DECnet project    */
  159. #define AF_NETBEUI    13    /* Reserved for 802.2LLC project*/
  160. #define AF_SECURITY    14    /* Security callback pseudo AF */
  161. #define pseudo_AF_KEY   15      /* PF_KEY key management API */
  162. #define AF_NETLINK    16
  163. #define AF_ROUTE    AF_NETLINK /* Alias to emulate 4.4BSD */
  164. #define AF_PACKET    17    /* Packet family        */
  165. #define AF_ASH        18    /* Ash                */
  166. #define AF_ECONET    19    /* Acorn Econet            */
  167. #define AF_ATMSVC    20    /* ATM SVCs            */
  168. #define AF_SNA        22    /* Linux SNA Project (nutters!) */
  169. #define AF_IRDA        23    /* IRDA sockets            */
  170. #define AF_MAX        32    /* For now.. */
  171.  
  172. /* Protocol families, same as address families. */
  173. #define PF_UNSPEC    AF_UNSPEC
  174. #define PF_UNIX        AF_UNIX
  175. #define PF_LOCAL    AF_LOCAL
  176. #define PF_INET        AF_INET
  177. #define PF_AX25        AF_AX25
  178. #define PF_IPX        AF_IPX
  179. #define PF_APPLETALK    AF_APPLETALK
  180. #define    PF_NETROM    AF_NETROM
  181. #define PF_BRIDGE    AF_BRIDGE
  182. #define PF_ATMPVC    AF_ATMPVC
  183. #define PF_X25        AF_X25
  184. #define PF_INET6    AF_INET6
  185. #define PF_ROSE        AF_ROSE
  186. #define PF_DECnet    AF_DECnet
  187. #define PF_NETBEUI    AF_NETBEUI
  188. #define PF_SECURITY    AF_SECURITY
  189. #define PF_KEY          pseudo_AF_KEY
  190. #define PF_NETLINK    AF_NETLINK
  191. #define PF_ROUTE    AF_ROUTE
  192. #define PF_PACKET    AF_PACKET
  193. #define PF_ASH        AF_ASH
  194. #define PF_ECONET    AF_ECONET
  195. #define PF_ATMSVC    AF_ATMSVC
  196. #define PF_SNA        AF_SNA
  197. #define PF_IRDA        AF_IRDA
  198.  
  199. #define PF_MAX        AF_MAX
  200.  
  201. /* Maximum queue length specifiable by listen.  */
  202. #define SOMAXCONN    128
  203.  
  204. /* Flags we can use with send/ and recv. 
  205.    Added those for 1003.1g not all are supported yet
  206.  */
  207.  
  208. #define MSG_OOB        1
  209. #define MSG_PEEK    2
  210. #define MSG_DONTROUTE    4
  211. #define MSG_TRYHARD     4       /* Synonym for MSG_DONTROUTE for DECnet */
  212. #define MSG_CTRUNC    8
  213. #define MSG_PROXY    0x10    /* Supply or ask second address. */
  214. #define MSG_TRUNC    0x20
  215. #define MSG_DONTWAIT    0x40    /* Nonblocking io         */
  216. #define MSG_EOR         0x80    /* End of record */
  217. #define MSG_WAITALL    0x100    /* Wait for a full request */
  218. #define MSG_FIN         0x200
  219. #define MSG_SYN        0x400
  220. #define MSG_URG        0x800
  221. #define MSG_RST        0x1000
  222. #define MSG_ERRQUEUE    0x2000
  223. #define MSG_NOSIGNAL    0x4000
  224.  
  225. #define MSG_CTLIGNORE   0x80000000
  226.  
  227. #define MSG_EOF         MSG_FIN
  228. #define MSG_CTLFLAGS    (MSG_OOB|MSG_URG|MSG_FIN|MSG_SYN|MSG_RST)
  229.  
  230.  
  231. /* Setsockoptions(2) level. Thanks to BSD these must match IPPROTO_xxx */
  232. #define SOL_IP        0
  233. /* #define SOL_ICMP    1    No-no-no! Due to Linux :-) we cannot use SOL_ICMP=1 */
  234. #define SOL_TCP        6
  235. #define SOL_UDP        17
  236. #define SOL_IPV6    41
  237. #define SOL_ICMPV6    58
  238. #define SOL_RAW        255
  239. #define SOL_IPX        256
  240. #define SOL_AX25    257
  241. #define SOL_ATALK    258
  242. #define SOL_NETROM    259
  243. #define SOL_ROSE    260
  244. #define SOL_DECNET    261
  245. #define    SOL_X25        262
  246. #define SOL_PACKET    263
  247. #define SOL_ATM        264    /* ATM layer (cell level) */
  248. #define SOL_AAL        265    /* ATM Adaption Layer (packet level) */
  249. #define SOL_IRDA        266
  250.  
  251. /* IPX options */
  252. #define IPX_TYPE    1
  253.  
  254. /* TCP options - this way around because someone left a set in the c library includes */
  255. #define TCP_NODELAY    1
  256. #define TCP_MAXSEG    2
  257. #define TCP_CORK    3    /* Linux specific (for use with sendfile) */
  258.  
  259. #ifdef __KERNEL__
  260. extern int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
  261. extern int memcpy_fromiovecend(unsigned char *kdata, struct iovec *iov, 
  262.                 int offset, int len);
  263. extern int csum_partial_copy_fromiovecend(unsigned char *kdata, 
  264.                       struct iovec *iov, 
  265.                       int offset, 
  266.                       unsigned int len, int *csump);
  267.  
  268. extern int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int mode);
  269. extern int memcpy_toiovec(struct iovec *v, unsigned char *kdata, int len);
  270. extern void memcpy_tokerneliovec(struct iovec *iov, unsigned char *kdata, int len);
  271. extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen);
  272. extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr);
  273. extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);
  274. #endif
  275. #endif /* not kernel and not glibc */
  276. #endif /* _LINUX_SOCKET_H */
  277.